package com.cpit.platform.service;

import com.cpit.platform.common.dao.SimpleExpression;
import com.cpit.platform.common.entity.Result;
import com.cpit.platform.common.entity.TableDataQueryCondition;
import com.cpit.platform.common.entity.TableJsonData;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.springframework.data.domain.Page;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

public interface EntityService<GenericClass> {
    /**
     * 创建实体类
     * @param GenericClass 要创建的实体类对象
     * @return 包含创建后的实体类的Result对象
     */
    Result<GenericClass> create(GenericClass GenericClass);

    /**
     * 修改实体类
     * @param GenericClass 要修改的实体类对象
     * @return 包含修改后的实体类的Result对象
     */
    Result<GenericClass> modify(GenericClass GenericClass);

    /**
     * 修改部分属性值
     * @param id 主键ID
     * @param partFieldValueMap 待修改的属性名和修改后的值组成的Map
     * @return 包含修改后的实体类的Result对象
     */
    Result<GenericClass> modify(Class clazz, Long id, Map<String, Object> partFieldValueMap);

    /**
     * 删除实体类
     * @param GenericClass 要删除的实体类对象
     * @return Result对象
     */
    Result<GenericClass>  delete(GenericClass GenericClass);

    /**
     * 删除实体类
     * @param id 主键ID
     */
    void  delete(Long id);

    /**
     * 查询全部
     * @return 包含全部对象的列表
     */
    List<GenericClass> findAll();

    /**
     * 根据主键ID查找实体类
     * @param id 主键ID
     * @return 实体类
     */
    GenericClass findById(Long id);

    /**
     * 根据给定的实体类属性名值对组成的Map条件查询符合条件的记录列表
     * @param queryCondMap 实体类属性名值对组成的Map条件
     * @return 符合条件的记录列表
     */
    List<GenericClass> findByQueryCondition(Map<String, Object> queryCondMap);

    /**
     * 根据给定的实体类属性名值对组成的Map条件查询符合条件的分页信息
     * @param page 当前页数， 以1开始
     * @param size 当前页的内容长度
     * @param order 排序方式：asc为升序，desc为降序
     * @param orderBy 排序字段，与对应entity中声明的字段名称一致
     * @param queryCondMap 实体类属性名值对组成的Map条件
     * @return 符合条件的分页信息
     */
    Page<GenericClass> findByQueryCondition(int page, int size, String order, String orderBy, Map<String, Object> queryCondMap);

    /**
     * 由SimpleExpression组成的List条件查询所有符合条件的记录列表
     * @param queryCondSimple SimpleExpression组成的List条件
     * @return 符合条件的记录列表
     */
    List<GenericClass> findByQueryCondition(List<SimpleExpression> queryCondSimple);


    /**
     * 由SimpleExpression组成的List条件查询所有符合条件的记录列表
     * @param simpleExpression SimpleExpression组成的条件
     * @return 符合条件的记录列表
     */
    List<GenericClass> findByQueryCondition(SimpleExpression simpleExpression);
    /**
     * 由SimpleExpression组成的List条件查询所有符合条件的分页信息
     * @param page 当前页数， 以1开始
     * @param size 当前页的内容长度
     * @param order 排序方式：asc为升序，desc为降序
     * @param orderBy 排序字段，与对应entity中声明的字段名称一致
     * @param queryCondSimple SimpleExpression组成的List条件
     * @return 符合条件的分页信息
     */
    Page<GenericClass> findByQueryCondition(int page, int size, String order, String orderBy, List<SimpleExpression> queryCondSimple);

    /**
     * 通过TableDataQueryCondition条件查询，返回jqGrid分页JSON形式
     * @param cond TableDataQueryCondition对象
     * @return TableJsonData对象
     */
    TableJsonData findByTableQueryCondition(TableDataQueryCondition cond);

    /**
     * 导出到到excel文件
     * @param request HttpServletRequest对象
     * @param response HttpServletResponse对象
     * @return
     */
    String export(HttpServletRequest request, HttpServletResponse response);

    /**
     * 导入文件内容
     * @param file
     * @param request
     * @return
     */
    public Result<Integer> fileImport(MultipartFile file, HttpServletRequest request);

    /**
     * 转化字段名为界面友好名
     * @param result
     * @param result
     * @return
     */
    Result<GenericClass> transColumnName(Result<GenericClass> result);
}
